package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.admin.dto.LoginDto;
import com.heima.admin.entity.AdUser;
import com.heima.admin.mapper.AdUserMapper;
import com.heima.admin.service.IAdUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.AppJwtUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 管理员用户信息表 服务实现类
 * </p>
 *
 * @author ZC
 * @since 2022-06-27
 */
@Service
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements IAdUserService {

    @Override
    public ResponseResult login(LoginDto dto) {
        //判断是否缺少参数  StringUtils.isBlank(dto.getName())账号为空 /密码为空
        if (dto==null|| (StringUtils.isBlank(dto.getName())||(StringUtils.isBlank(dto.getPassword())))){
            //如果上述其中任何一项为空则 直接返回错误提示信息
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        //根据用户名查询用户   用户名不重复  有唯一索引
        LambdaQueryWrapper<AdUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AdUser::getName,dto.getName());
        //获取唯一的用户名
        AdUser one = this.getOne(queryWrapper);
        if (one==null) {
            //如果这个用户名为null 则表示数据库中无此数据 返回对应的提示信息 -用户信息不存在
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }
        //在进行密码的比较   密码加密方式 MD5 - 结果是固定的  结果是不可逆的  可以在明文(可以看明白的密码)的基础上加盐(自己定义的字段)
        // =>加盐后的密码会变成 密文(看不懂的16进制的数据)
        String password = DigestUtils.md5Hex(dto.getPassword() + one.getSalt());
        // 获取到password 加上从数据库获取的盐 赋值给password
        if (!StringUtils.equals(one.getPassword(),password)) {
            //比较从数据库中获取到的密码和上面加盐的密码  =>取反 返回错误提示
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        //程序到此 证明密码验证成功  返回前端需要的数据(在页面F12可以看到)  =>装进一个map
        Map resultMap = new HashMap();
        //去除map中的敏感数据
        one.setPassword("");  //密码
        one.setSalt("");      //加的盐
        resultMap.put("user",one); //放入map

        //jwt 分成三个部分 第一部分是头 第二部分是需要传的参数(载荷) 第三部分是签名
        // 其中第 一和三 不可更改  二则是需要传递的参数  jwt.io
        Map<String,Object> claimMaps = new HashMap<>();
        claimMaps.put("userId",one.getId());
        claimMaps.put("name",one.getName());
        //把上面两个从数据库获取出来的的数据放入到Map中
        String token = AppJwtUtil.getToken(claimMaps);
        //传入map 生成token  载荷部分是上面传入map的数据
        resultMap.put("token",token);//放入map
        return ResponseResult.okResult(resultMap);
        //返回 resultMap
    }
}
